#include "app_adc.h"

#if (defined(CFG_FREERTOS_SUPPORT)&&(CFG_FREERTOS_SUPPORT==1))
#include "FreeRTOS.h"
#include "timers.h"
#endif

#define ADC_GPADC_SINGLE_END_MODE_EN 1
#define ADC_GPADC_DIFFERENTIAL_MODE_EN 0
#if (defined BX_TEMP_SENSOR) && (BX_TEMP_SENSOR == 1) 
#define ADC_TEMP_SENSOR_EN 1
#else
#define ADC_TEMP_SENSOR_EN 0
#endif

#define ADC_RO_READ_FORCE_ON

#if (defined BX_BATTERY_MONITOR) && (BX_BATTERY_MONITOR == 1)
/**
 *******************************************************************************************************************************************
 * @brief          Set current battery voltage.
 *******************************************************************************************************************************************
 */
void app_set_cur_bat(void);

/**
 *******************************************************************************************************************************************
 * @brief          Get current battery voltage.
 * @return         Current battery voltage.
 *******************************************************************************************************************************************
 */
uint16_t app_get_cur_bat(void);
/**
 *******************************************************************************************************************************************
 * @brief          Adjust system registers according to current battery voltage.
 * @param[in]      xTimer    Timer handle.
 *******************************************************************************************************************************************
 */
void adc_sys_adjust_bat(TimerHandle_t xTimer);
#endif

/**
 *******************************************************************************************************************************************
 * @brief          ADC comparator function for qsort.
 * @param[in]      *a    Pointer of item to be compared.
 * @param[out]     *b    Pointer of item to be compared.
 * @return         Compared result.
 *******************************************************************************************************************************************
 */
//static int adc_comparator(const void *a, const void *b);

/**
 *******************************************************************************************************************************************
 * @brief          Read trim RO value function.
 *******************************************************************************************************************************************
 */
void app_adc_readRO(void);

/**
 *******************************************************************************************************************************************
 * @brief          Calculate RO value under battery=3.9V.
 *******************************************************************************************************************************************
 */
void app_adc_RO_sim_3V9(void);
/**
 *******************************************************************************************************************************************
 * @brief          Calculate RO value under any circumstance.
 *******************************************************************************************************************************************
 */
void app_adc_util_init(void);
/**
 *******************************************************************************************************************************************
 * @brief          Get current battery voltage.
 * @return         Current battery voltage value(in mini volt).
 *******************************************************************************************************************************************
 */
uint32_t app_adc_battery(void);

#if ADC_TEMP_SENSOR_EN
/**
 *******************************************************************************************************************************************
 * @brief          Function getting temperature sensor raw value.
 * @param[in]      *adc_p    Pointer of adc instance.
 * @return         Temperature sensor raw value.
 *******************************************************************************************************************************************
 */
static uint16_t app_adc_tempSensor_raw(app_adc_inst_t *adc_p);

/**
 *******************************************************************************************************************************************
 * @brief          Get current temperature sensor.
 * @return         Current temperature sensor value.
 *******************************************************************************************************************************************
 */
int16_t app_adc_tempSensor(void);
#endif

#if (defined BX_TEMP_SENSOR) && (BX_TEMP_SENSOR == 1)  
/**
 *******************************************************************************************************************************************
 * @brief          Set current temperature sensor.
 *******************************************************************************************************************************************
 */
void app_set_cur_temp(void);
/**
 *******************************************************************************************************************************************
 * @brief          Get current temperature sensor.
 * @return         Current temperature sensor value.
 *******************************************************************************************************************************************
 */
int16_t app_get_cur_temp(void);
/**
 *******************************************************************************************************************************************
 * @brief          Adjust system registers according to current temperature sensor.
 * @param[in]      xTimer    Timer handle.
 *******************************************************************************************************************************************
 */
//void adc_sys_adjust_temp(TimerHandle_t xTimer);
#endif

#if ADC_GPADC_SINGLE_END_MODE_EN
uint32_t adc_value_convert(uint16_t val_1 , uint16_t val_2);

/**
 *******************************************************************************************************************************************
 * @brief          Get current single end gpadc voltage.
 * @param[in]      channel Channel to sample. 
 * @return         Current gpadc voltage value(in mini volt).
 *******************************************************************************************************************************************
 */
uint32_t app_adc_gpadc_single_end(uint8_t channel);
#endif

#if ADC_GPADC_DIFFERENTIAL_MODE_EN
/**
 *******************************************************************************************************************************************
 * @brief          Get current differential gpadc voltage.
 * @param[in]      channel Channel to sample. 
 * @return         Current gpadc voltage value(in mini volt).
 *******************************************************************************************************************************************
 */
uint32_t app_adc_gpadc_differential(uint8_t channel);
#endif




